home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / kernel / copy68k.s < prev    next >
Text File  |  1990-07-15  |  14KB  |  344 lines

  1. #include <minix/config.h>
  2. #if (CHIP == M68000)
  3. #ifdef ACK
  4. ! (ACK needs an #ifdef before the first comment !)
  5. ! Note: ACK converts move.l, sub.l add.l to moveq,subq,addq where possible !
  6.  
  7. !****************************************************************************
  8. !
  9. !     C O P Y _ 6 8 K . S                                       M I N I X
  10. !
  11. !     Basic fast copy routines used by the kernel 
  12. !****************************************************************************
  13. !
  14. ! Contents:
  15. !
  16. !   flipclicks   exchange two block of clicks
  17. !   zeroclicks   zero a block of clicks
  18. !   copyclicks   copy a block of clicks
  19. !   phys_copy    copy a block of bytes
  20. !
  21. !============================================================================
  22. ! Edition history
  23. !
  24. !  #    Date                         Comments                       By
  25. ! --- -------- ---------------------------------------------------- --- 
  26. !   1 13.06.89 fast phys_copy by Dale Schumacher                    DAL
  27. !   2 16.06.89 bug fixes and code impromvement by Klamer Schutte    KS
  28. !   3 12.07.89 bug fix and further code improvement to phys_copy    RAL
  29. !   4 14.07.89 flipclicks,zeroclicks,copyclicks added               RAL
  30. !   5 15.07.89 fast copy routine for messages added to phys_copy    RAL
  31. !   6 03.08.89 clr.l <ea> changed to move.l #0,<ea> (= moveq )      RAL
  32. !
  33. !****************************************************************************
  34.  
  35.            .sect    .text
  36.            .sect    .rom
  37.            .sect    .data
  38.            .sect    .bss
  39.  
  40.  
  41.            .sect    .text
  42.  
  43.            .extern  _flipclicks
  44.            .extern  _zeroclicks
  45.            .extern  _copyclicks
  46.            .extern  _phys_copy
  47.  
  48.  
  49. !****************************************************************************
  50. !
  51. !          f l i p c l i c k s
  52. !
  53. !          exchange to blocks of n clicks
  54. !****************************************************************************
  55. !
  56. ! Input:   on stack:
  57. !                 fnclick.w   - number of clicks to copy
  58. !                 fadr2cl.w   - physical click address 2
  59. !                 fadr1cl.w   - physical click address 1
  60. !          (a7) ->(rts_ptr.l) - abs. return ptr.
  61. !
  62. ! Output:  d0,d1,a0,a1  - *
  63. !
  64. !****************************************************************************
  65.  
  66. fadr1cl    =        0x4                   ! click address 1          .w
  67. fadr2cl    =        0x6                   ! click address 2          .w
  68. fnclick    =        0x8                   ! number of clicks to flip .w
  69.  
  70. _flipclicks:
  71.            move.l   #0,d0
  72.            move.w   fadr1cl(a7),d0        ! address 1 in clicks
  73.            lsl.l    #8,d0
  74.            move.l   d0,a0                 ! address 1 ptr.
  75.            move.l   #0,d0
  76.            move.w   fadr2cl(a7),d0        ! address 2 in clicks
  77.            lsl.l    #8,d0
  78.            move.l   d0,a1                 ! address 2 ptr.
  79.            move.l   #0,d0
  80.            move.w   fnclick(a7),d0        ! number of clicks to exchange
  81.            lsl.l    #2,d0                 ! need 4 loops to flip a click
  82.            movem.l  d2-d7/a2-a6,-(a7)     ! save registers used for flip
  83.            bra      endflip
  84. flip64:
  85.            movem.l  (a0)+,d1-d6           ! load from adr1  6x4 bytes
  86.            movem.l  (a1)+,d7/a2-a6        ! load from adr2  6x4 bytes
  87.            movem.l  d7/a2-a6,-24(a0)      ! store to  adr1  6x4 bytes
  88.            movem.l  d1-d6,-24(a1)         ! store to  adr2  6x4 bytes
  89.            movem.l  (a0)+,d1-d6           ! load from adr1  6x4 bytes
  90.            movem.l  (a1)+,d7/a2-a6        ! load from adr2  6x4 bytes
  91.            movem.l  d7/a2-a6,-24(a0)      ! store to  adr1  6x4 bytes
  92.            movem.l  d1-d6,-24(a1)         ! store to  adr2  6x4 bytes
  93.            movem.l  (a0)+,d1-d4           ! load from adr1  4x4 bytes
  94.            movem.l  (a1)+,a2-a5           ! load from adr2  4x4 bytes
  95.            movem.l  a2-a5,-16(a0)         ! store to  adr1  4x4 bytes
  96.            movem.l  d1-d4,-16(a1)         ! store to  adr2  4x4 bytes
  97. endflip:
  98.            dbra     d0,flip64             ! decrement count, test and loop
  99.            sub.l    #0x10000,d0           ! dbra handles only word counters
  100.            bhi      flip64                !  -> next 64 x 64k bytes
  101.            movem.l  (a7)+,d2-d7/a2-a6     ! restore registers used to flip
  102.            rts
  103.  
  104. !****************************************************************************
  105. !
  106. !          z e r o c l i c k s
  107. !
  108. !          zero n clicks from source click to destination click address
  109. !****************************************************************************
  110. !
  111. ! Input:   on stack:
  112. !                 znclick.w   - number of clicks to zero
  113. !                 zdestcl.w   - physical destination click address
  114. !          (a7) ->(rts_ptr.l) - abs. return ptr.
  115. !
  116. ! Output:  d0,d1,a0,a1  - *
  117. !
  118. !****************************************************************************
  119.  
  120. zdestcl    =        0x4                   ! destination click address .w
  121. znclick    =        0x6                   ! number of clicks to zero  .w
  122.  
  123. _zeroclicks:
  124.            move.l   #0,d0
  125.            move.w   zdestcl(a7),d0        ! destination address in clicks
  126.            lsl.l    #8,d0
  127.            move.l   d0,a0                 ! destination ptr.
  128.            move.w   znclick(a7),d0        ! number of clicks to zero
  129.            movem.l  d2-d7/a2-a6,-(a7)     ! save registers used to zero
  130.            move.l   #0,d1                 ! zero registers
  131.            move.l   d1,d2
  132.            move.l   d1,d3
  133.            move.l   d1,d4
  134.            move.l   d1,d5
  135.            move.l   d1,d6
  136.            move.l   d1,d7
  137.            move.l   d1,a1
  138.            move.l   d1,a2
  139.            move.l   d1,a3
  140.            move.l   d1,a4
  141.            move.l   d1,a5
  142.            move.l   d1,a6
  143.            lea      256(a0),a0            ! top of first click
  144.            bra      endzero
  145. zero256:
  146.            movem.l  d1-d7/a1-a6,-(a0)     ! zero 13x4 bytes
  147.            movem.l  d1-d7/a1-a6,-(a0)     ! zero 13x4 bytes
  148.            movem.l  d1-d7/a1-a6,-(a0)     ! zero 13x4 bytes
  149.            movem.l  d1-d7/a1-a6,-(a0)     ! zero 13x4 bytes
  150.            movem.l  d1-d7/a1-a5,-(a0)     ! zero 12x4 bytes
  151.            lea      512(a0),a0            ! top of next click
  152. endzero:
  153.            dbra     d0,zero256            ! decrement count, test and loop
  154.            movem.l  (a7)+,d2-d7/a2-a6     ! restore registers used to zero
  155.            rts
  156.  
  157. !****************************************************************************
  158. !
  159. !          c o p y c l i c k s
  160. !
  161. !          copy n clicks from source click to destination click address
  162. !****************************************************************************
  163. !
  164. ! Input:   on stack:
  165. !                 cnclick.w   - number of clicks to copy
  166. !                 cdestcl.w   - physical destination click address
  167. !                 csrccl.w    - physical source click address
  168. !          (a7) ->(rts_ptr.l) - abs. return ptr.
  169. !
  170. ! Output:  d0,d1,a0,a1  - *
  171. !
  172. ! Rem.: subroutines for this call are common to phys_copy !
  173. !
  174. !****************************************************************************
  175.  
  176. csrccl     =        0x4                   ! source click address      .w
  177. cdestcl    =        0x6                   ! destination click address .w
  178. cnclick    =        0x8                   ! number of clicks to copy  .w
  179.  
  180. _copyclicks:
  181.            move.l   #0,d0
  182.            move.w   csrccl(a7),d0         ! source address in clicks
  183.            lsl.l    #8,d0
  184.            move.l   d0,a0                 ! source ptr.
  185.            move.l   #0,d0
  186.            move.w   cdestcl(a7),d0        ! destination address in clicks
  187.            lsl.l    #8,d0
  188.            move.l   d0,a1                 ! destination ptr.
  189.            move.w   cnclick(a7),d0        ! number of clicks to copy
  190.            movem.l  d2-d7/a2-a6,-(a7)     ! save registers used for copy
  191.            move.l   #0,d1                 ! no remainder
  192.            bra      end256
  193. loop256:
  194.            movem.l  (a0)+,d2-d7/a2-a6     ! copy 11x4 bytes
  195.            movem.l  d2-d7/a2-a6,(a1)
  196.            movem.l  (a0)+,d2-d7/a2-a6     ! copy 11x4 bytes
  197.            movem.l  d2-d7/a2-a6,44(a1)
  198.            movem.l  (a0)+,d2-d7/a2-a6     ! copy 11x4 bytes
  199.            movem.l  d2-d7/a2-a6,88(a1)
  200.            movem.l  (a0)+,d2-